import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.lang.*;
import java.lang.String;

/**
 * Created by fjc on 2017/3/14.
 */
public class key {
    //直接创建jedis
//    Jedis jedis = new Jedis("localhost",6379);
    //创建对象池
    JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"localhost",6379);
    //获取jedis
    Jedis jedis = jedisPool.getResource();

    @Test
    public void del(){
        //用于在 key 存在是删除 key
        jedis.set("1","第一");
        System.out.println(jedis.get("1"));
        jedis.del("1");
        System.out.println(jedis.get("1"));
    }

    /**
     * 关于序列化和反序列化
     *  1. jedis提供的API只有两种类型,目前没有直接可存储java对象的API
     *     可存储String,List,Set,Hash,SortedSet,HyperLogLog    (String,String)
     *     可适用于将java对象序列化后存储redis                  (byte[],byte[])
     *  2. redis自带dump()序列化和restore()反序列化，能对已经存在redis中的数据进行序列化和反序列化
     */
    @Test
    public void dump(){
        //序列化给定 key ，并返回被序列化的值
        jedis.set("2","hello,dumping world!");
        System.out.println(jedis.get("2"));
        byte[] b = jedis.dump("2");
        System.out.println("序列化后："+b);
        System.out.println(jedis.get("2"));
        jedis.del("2");
        //反序列化给定的序列化值，并将它和给定的 key 关联,参数 ttl 以毫秒为单位为 key 设置生存时间；如果 ttl 为 0 ，那么不设置生存时间。(必须key不存在，否则报错busy)
        System.out.println(jedis.restore("2",0,b)+"反序列化："+jedis.get("2"));
    }

    @Test
    public void exists(){
        //检查给定 key 是否存在
        System.out.println(jedis.exists("2"));
    }

    @Test
    public void save(){
        //Redis 持久化有两种方式：1. RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储,Redis意外宕机,你可能会丢失几分钟的数据，dump.rdb文件
                              // 2. AOF持久化方式记录每次对服务器写的操作，默认不开启 appendonly.aof文件
        //创建当前数据库的备份
        jedis.save();//存储为dump.rdb文件
        jedis.bgrewriteaof();//存储为appendonly.aof文件
//        jedis.bgsave();//后台执行
    }

    @Test
    public void expire() throws Exception{
        //为给定 key 设置过期时间
        jedis.expire("2",5);
        Thread.sleep(5000);
        System.out.println(jedis.get("2"));

    }

    @Test
    public void expireAt(){
        //为给定 key 设置过期时间,不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳
        jedis.expire("2",5);
        jedis.expireAt("2",1489468553);
    }

    @Test
    public void pExpireAt(){
        //设置 key 的过期时间亿以毫秒计
        jedis.pexpireAt("2",1555555555);
    }

    @Test
    public void pattern(){
        //查找所有符合给定模式( pattern)的 key
        jedis.set("name1","第三");
        jedis.set("name2","第四");
        jedis.set("name3","第五");
        System.out.println(jedis.keys("*"));
        System.out.println(jedis.keys("*name*"));
        System.out.println(jedis.keys("n????"));
    }

    @Test
    public void move(){
        //将当前数据库的 key 移动到给定的数据库 db 当中
        jedis.move("name1",1);
        //原db中彻底删除key-value
        System.out.println(jedis.get("name1"));
        //切换查看key-value
        jedis.select(1);
        System.out.println(jedis.get("name1"));
    }

    @Test
    public void persist() throws Exception{
        // 移除 key 的过期时间，key 将持久保持
        jedis.set("6","diliu");
        jedis.expire("6",2);
        jedis.persist("6");
        Thread.sleep(3000);
        System.out.println(jedis.get("6"));
    }

    @Test
    public void pttl()throws Exception{
        //以毫秒为单位返回 key 的剩余的过期时间
        jedis.set("7","第七");
        jedis.expire("7",3);
        Thread.sleep(1000);
        System.out.println(jedis.pttl("7"));
    }

    @Test
    public void randomKey(){
        //从当前数据库中随机返回一个 key
        System.out.println(jedis.randomKey());
    }

    @Test
    public void reName(){
        //修改 key 的名称
        jedis.set("8","第八");
        jedis.rename("8","9");
        System.out.println(jedis.get("8"));
        System.out.println(jedis.get("9"));
    }

    @Test
    public void renamex(){
        //仅当 newkey 不存在时，将 key 改名为 newkey
        jedis.set("10","第十");
        jedis.renamenx("10","11");
        System.out.println(jedis.get("11"));
        jedis.set("12","十二");
        //当想要修改成的newkey存在时，失败返回0
        System.out.println(jedis.renamenx("12","11"));
    }

    @Test
    public void type(){
        //返回 key 所储存的值的类型
        System.out.println(jedis.type("12"));
    }


}
